package com.example.demo.day0303;

import com.example.demo.day0302.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.*;
public class DemoReflect3 {
    public static void main(String[] args) {
        try {
            Class clazz = Class.forName("com.example.demo.day0302.Student");

            /**
             * 所有调用都是调用的newInstancs创造出的对象obj的方法
             * obj就是Student类的对象
             */
            Constructor con = clazz.getConstructor();//获取无参构造
            Object obj = con.newInstance();//使用无参构造创建对象
            Method m = clazz.getMethod("setInfo", String.class,String.class);//而得到名称叫setInfo，参数书String和String
            m.invoke(obj,"tom","firsthighschool");//参数1是需要实例化的对象，后面的参数是调用当前的方法实际参数
            /**
             * 等同于
             */
            Student obj2 =new Student();obj2.setInfo("tom","firsthighschool");

            Method m1 = clazz.getDeclaredMethod("test", String.class);//获取方法名为test，参数为1个String类型的私有方法

            m1.setAccessible(true);//解除私有的封装，之后强行调用该方法
            Object  ret = m1.invoke(obj,"huk");
            System.out.println(ret);
            Method m2 = clazz.getMethod("getSchool");//获取无参数的getSchool方法
            String school = (String) m2.invoke(obj);//调用有返回值但没有参数的方法
            System.out.println(school);//获得m对obj设置的school的属性

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
